home *** CD-ROM | disk | FTP | other *** search
/ PC Graphics Unleashed / PC Graphics Unleashed.iso / ch09 / sweep.c < prev    next >
C/C++ Source or Header  |  1994-06-05  |  31KB  |  1,302 lines

  1. /*
  2.   3D SWEEP OBJECT GENERATOR
  3.   by Alfonso Hermida
  4. */
  5.  
  6. #include <conio.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <graphics.h>
  10. #include <dos.h>
  11. #include <dir.h>
  12. #include <math.h>
  13. #include <string.h>
  14. #include <ctype.h>
  15.  
  16.  
  17.  
  18. #define ViewPort3D         setviewport(0,0,getmaxy(),getmaxy(),1);
  19. #define FullScreenViewPort setviewport(0,0,getmaxx(),getmaxy(),1);
  20. #define DELAY              delay(50);
  21.  
  22. #define TOL 0.0005
  23. #define PI  3.14159265358979323846
  24. #define LMB 1
  25. #define RMB 2
  26. #define MAXDATA 51
  27. #define UP   " \x1E"
  28. #define DOWN " \x1F"
  29.  
  30. #define _NEW      0
  31. #define _CREATE   1
  32. #define _MOVE     2
  33. #define _DELETE   3
  34. #define _SNAP     4
  35. #define _GRID     5
  36.  
  37. #define _V2D      7
  38. #define _PREVIEW  8
  39. #define _LOAD     9
  40. #define _DXF      10
  41. #define _POLYRAY  11
  42. #define _DATA     12
  43. #define _RAW      13
  44. #define _GRIDDIVU 14
  45. #define _GRIDDIVD 15
  46. #define _SPLINEU  16
  47. #define _SPLINED  17
  48. #define _DELTAU      18
  49. #define _DELTAD   19
  50. #define _SEGSU    20
  51. #define _SEGSD    21
  52. #define _EXIT     22
  53.  
  54. #define IconNum   23
  55. #define ESCkey    27
  56. #define TEXT_INPUT   1
  57. #define NUMBER_INPUT 0
  58.  
  59. typedef struct {
  60.   int x,y,width,height,color;
  61.   char str[81];
  62. } Icon;
  63.  
  64. typedef struct {
  65.    float rmin, cmin,
  66.      rowstep,colstep;
  67.    int rows, cols;
  68. } GRID;
  69.  
  70. typedef struct {
  71.  float x,y,z;
  72. } POINT3D;
  73.  
  74. typedef struct {
  75.  int x,y;
  76. } POINTint;
  77.  
  78.  
  79. union REGS inregs;
  80. union REGS outregs;
  81.  
  82. /* World Limits in 2D */
  83. float WXleft;
  84. float WXright;
  85. float WYtop;
  86. float WYbottom;
  87.  
  88. /* Device Limits */
  89. int DXmin;
  90. int DYmin;
  91. int DYmax;
  92. int DXmax;
  93.  
  94. /* Rotations for 3D View in Radians*/
  95. float RX;
  96. float RY;
  97. float RZ;
  98. float COSRX;
  99. float SINRX;
  100. float COSRY;
  101. float SINRY;
  102. float COSRZ;
  103. float SINRZ;
  104.  
  105. /* Sweep Info */
  106. float DeltaAngle;
  107. float COSDA;
  108. float SINDA;
  109. int Segments;
  110. int SplineSmooth;
  111.  
  112. GRID g;
  113.  
  114. int GridRowCol;
  115. int GridStatus;
  116. int SnapStatus;
  117. int PBnum;
  118. POINT3D PointBuffer[MAXDATA];
  119. int DrawStatus;
  120.  
  121. void  *BitMap;
  122. char FileName[13], PolyrayFileName[13],
  123.      RAWFileName[13], DXFFileName[13];
  124. int DXF, RAW;
  125. FILE *DXFfptr, *RAWfptr;
  126.  
  127. void InitGraphics(void);
  128. void ScreenToWorld2D(int x,int y,float *px, float *py);
  129. void GetGridPoint2D(int mx,int my, float * wx, float * wy);
  130. void UpdateMousePos(int xpos,int ypos,int status, int draw);
  131. void UpdateGridStatus(void);
  132. int IsMouse(void);
  133. int MouseClick(void);
  134. void MouseXY(int *xpos,int *ypos);
  135. void MouseShow(int YesNo);
  136. float DegToRad(float deg);
  137. float RadToDeg(float rad);
  138. POINT3D World3DToWorld2D(POINT3D p);
  139. POINTint World2DToDevice(POINT3D p);
  140. void drawpoint(POINT3D p1);
  141. void drawline(POINT3D p1,POINT3D p2);
  142. void drawgrid (void);
  143. void drawaxis(void);
  144. void SetAxesAngles(float rx, float ry, float rz);
  145. void SweepData(void);
  146. void DrawSpline(void);
  147. void SweepALine(POINT3D pa, POINT3D pb);
  148. Icon CreateIcon(int xo,int yo,int width,int height,
  149.         int color,char * text);
  150. void DrawIcon(Icon ic);
  151. int IconCheck(Icon ikon,int xm,int ym);
  152. void CreateIconColumn(int xo,int yo,int width,int height,int color,
  153.               int spc, int num, Icon icon[],char **text);
  154. void CreateIconRow(int xo,int yo,int width,int height,int color,
  155.            int spc, int num, Icon icon[],char **text);
  156. void InitVariables(void);
  157. int YesNoCMD(char *s);
  158. void Redraw(void);
  159. void DrawIconHiLite(Icon ic, int OnOff);
  160. int SelectAPoint(int x, int y);
  161. void ChangeParameter(int which, int UpDown);
  162. void DisplayVars(void);
  163. void Preview(void);
  164. void LoadAFile(char *str);
  165. void SaveAFile(char *str);
  166. void AllocateInputBox(void);
  167. void EraseInputBox(void);
  168. char * InputBox(char *s);
  169. char* KeyInput(char* str,int text);
  170. char* prompt (int x,int y);
  171. void SaveToPolyray(char * str);
  172.  
  173. void main()
  174. {
  175.  
  176.   int xpos, ypos, xposold=0, yposold=0, btn;
  177.   int i, j, QUIT=0, tmp, FLAG;
  178.   float wx, wy;
  179.   POINT3D p, pold;
  180.   char str[13];
  181.   Icon icon[IconNum];                       // icon ID #:
  182.   char  *str1[9] = {"  New",                // 0
  183.             " Create",              // 1
  184.             "  Move",               // 2
  185.             " Delete",              // 3
  186.             "  Snap",               // 4
  187.             "  Grid",               // 5
  188.             "",                     // 6
  189.             "   2D",                // 7
  190.             " Preview"};            // 8
  191.  
  192.   char  *str2[5] = {"  Load",               // 9
  193.             "  DXF",                // 10
  194.             " Polyray",             // 11
  195.             "  Data",               // 12
  196.             "  Raw"};               // 13
  197.  
  198.   char  *str3[8] = {UP,                     // 14         Grid Divisions
  199.             DOWN,                   // 15
  200.             UP,                     // 16         Spline Smooth
  201.             DOWN,                   // 17
  202.             UP,                     // 18         Delta Angle
  203.             DOWN,                   // 19
  204.             UP,                     // 20         number of segments
  205.             DOWN};                  // 21
  206.  
  207.   InitGraphics();
  208.  
  209.   if (!IsMouse()) {
  210.        closegraph();
  211.        printf("MOUSE driver not installed!");
  212.        exit(1);
  213.   }
  214.   setfillstyle(SOLID_FILL,LIGHTGRAY);
  215.   bar3d(getmaxy()+1,0,getmaxx(),getmaxy(),0,0);
  216.  
  217.   CreateIconColumn(getmaxy()+10,50,70,15,LIGHTGRAY,5,9,icon,str1);
  218.   CreateIconColumn(getmaxy()+85,50,70,15,LIGHTGRAY,5,5,icon+9,str2);
  219.   CreateIconColumn(getmaxy()+10,240,24,15,LIGHTBLUE,5,8,icon+14,str3);
  220.   icon[22] = CreateIcon(getmaxy() + 45,getmaxy()-30,60,15,RED," QUIT");
  221.   for(i=0;i<IconNum;i++) if (i!=6) DrawIcon(icon[i]);
  222.  
  223.   setcolor(BLACK);
  224.   outtextxy(icon[14].x + 70,(icon[14].y + icon[15].y)/2,  "Grid");
  225.   outtextxy(icon[16].x + 70,(icon[16].y + icon[17].y)/2,  "Spline");
  226.   outtextxy(icon[18].x + 70,(icon[18].y + icon[19].y)/2,  "Angle");
  227.   outtextxy(icon[20].x + 70,(icon[20].y + icon[21].y)/2,  "Segs");
  228.   setcolor(WHITE);
  229.  
  230.   InitVariables();
  231.   drawaxis();
  232.   DisplayVars();
  233.   MouseShow(1);
  234.  
  235.   do {
  236.     do {
  237.       MouseXY(&xpos,&ypos);
  238.       if((xpos != xposold) || (ypos != yposold))
  239.           UpdateMousePos(xpos,ypos,0,0);
  240.       xposold = xpos;
  241.       yposold = ypos;
  242.       btn = MouseClick();
  243.     }while(!btn);
  244.     if ((btn == LMB) && (xpos < getmaxy()) && DrawStatus)
  245.                 UpdateMousePos(xpos,ypos,1,1);
  246.  
  247.     for(i=0;i<IconNum;i++) {
  248.        if(IconCheck(icon[i],xpos,ypos)) {
  249.      switch(i) {
  250.        case _NEW     :
  251.         DrawIconHiLite(icon[_NEW], 1);
  252.         if(YesNoCMD("       Delete All?")) InitVariables();
  253.         Redraw();
  254.         DrawIconHiLite(icon[_NEW], 0);
  255.         break;
  256.        case _CREATE  :
  257.          if(DrawStatus) DrawStatus = 0;
  258.          else DrawStatus = 1;
  259.          DrawIconHiLite(icon[_CREATE], DrawStatus);
  260.          break;
  261.        case _MOVE    :
  262.          DrawIconHiLite(icon[_MOVE], 1);
  263.          DrawStatus = 0;
  264.          DrawIconHiLite(icon[_CREATE], 0);
  265.          do {
  266.            MouseXY(&xpos,&ypos);
  267.            btn = MouseClick();
  268.          }while(!btn);
  269.          if (btn == LMB) {
  270.            tmp = SelectAPoint(xpos, ypos);
  271.            if(tmp != -1) {
  272.              ViewPort3D
  273.              FLAG = 0;
  274.              setwritemode(1);
  275.              xposold = xpos;
  276.              yposold = ypos;
  277.              setcolor(WHITE);
  278.              do {
  279.                MouseXY(&xpos,&ypos);
  280.                if((xposold != xpos) || (yposold != ypos)) {
  281.  
  282.              if(!FLAG) {
  283.               MouseShow(0);
  284.               if (tmp > 0 && (tmp < PBnum))
  285.                 drawline(PointBuffer[tmp],PointBuffer[tmp-1]);
  286.               if (tmp < PBnum - 1)
  287.                 drawline(PointBuffer[tmp],PointBuffer[tmp+1]);
  288.               drawpoint(PointBuffer[tmp]);
  289.               MouseShow(1);
  290.              }
  291.              if(SnapStatus) GetGridPoint2D(xpos,ypos,&wx,&wy);
  292.              else  ScreenToWorld2D(xpos,ypos,&wx, &wy);
  293.              p.x = wx;
  294.              p.y = wy;
  295.              p.z = 0.0;
  296.              MouseShow(0);
  297.              if (FLAG) {
  298.                 if (tmp > 0 && (tmp < PBnum))
  299.                 drawline(pold,PointBuffer[tmp-1]);
  300.                 if (tmp < PBnum - 1)
  301.                 drawline(pold,PointBuffer[tmp+1]);
  302.              }
  303.              if (tmp > 0 && (tmp < PBnum))
  304.                 drawline(p,PointBuffer[tmp-1]);
  305.              if (tmp < PBnum - 1)
  306.                 drawline(p,PointBuffer[tmp+1]);
  307.              MouseShow(1);
  308.              pold = p;
  309.              xposold = xpos;
  310.              yposold = ypos;
  311.              FLAG = 1;
  312.                }
  313.                btn = MouseClick();
  314.              }while(!btn);
  315.              if(btn == LMB) PointBuffer[tmp] = p;
  316.              setwritemode(0);
  317.            }
  318.            Redraw();
  319.          }
  320.          DrawIconHiLite(icon[_MOVE], 0);
  321.          break;
  322.        case _DELETE  :
  323.          DrawIconHiLite(icon[_DELETE], 1);
  324.          DrawStatus = 0;
  325.          DrawIconHiLite(icon[_CREATE], 0);
  326.          do {
  327.            MouseXY(&xpos,&ypos);
  328.            btn = MouseClick();
  329.          }while(!btn);
  330.          if (btn == LMB) {
  331.            tmp = SelectAPoint(xpos, ypos);
  332.            if(tmp != -1) {
  333.              if (tmp == PBnum - 1)
  334.               PBnum--;
  335.              else {
  336.               for(j=tmp;j<PBnum-1;j++)
  337.                    PointBuffer[j] = PointBuffer[j+1];
  338.               PBnum--;
  339.              }
  340.            }
  341.            Redraw();
  342.          }
  343.          DrawIconHiLite(icon[_DELETE], 0);
  344.          break;
  345.        case _SNAP    :
  346.          if (SnapStatus) SnapStatus = 0;
  347.          else SnapStatus = 1;
  348.          DrawIconHiLite(icon[_SNAP], SnapStatus);
  349.          break;
  350.        case _GRID    :
  351.          if (GridStatus) GridStatus = 0;
  352.          else GridStatus = 1;
  353.          Redraw();
  354.          DrawIconHiLite(icon[_GRID], GridStatus);
  355.          break;
  356.        case _V2D     :
  357.          DrawIconHiLite(icon[_V2D], 1);
  358.          Redraw();
  359.          DrawIconHiLite(icon[_V2D], 0);
  360.          break;
  361.        case _PREVIEW :
  362.          DrawIconHiLite(icon[_PREVIEW], 1);
  363.          Preview();
  364.          DrawIconHiLite(icon[_PREVIEW], 0);
  365.          break;
  366.        case _LOAD    : MouseShow(0);
  367.                strcpy(str,KeyInput("Load File:",TEXT_INPUT));
  368.                LoadAFile(str);
  369.                MouseShow(1);
  370.                Redraw();
  371.                break;
  372.        case _DXF     : MouseShow(0);
  373.                sprintf(str,"Save As < %s >",DXFFileName);
  374.                strcpy(str,KeyInput(str,TEXT_INPUT));
  375.                if (strlen(str) == 0) strcpy(str,DXFFileName);
  376.                MouseShow(1);
  377.                DXF = 1;
  378.                if ((DXFfptr = fopen(str,"w+t")) != NULL) {
  379.                   Preview();
  380.                   fclose(DXFfptr);
  381.                   strcpy(DXFFileName,str);
  382.                }
  383.                DXF = 0;
  384.                break;
  385.        case _POLYRAY : MouseShow(0);
  386.                sprintf(str,"Save As < %s >",PolyrayFileName);
  387.                strcpy(str,KeyInput(str,TEXT_INPUT));
  388.                if (strlen(str) == 0) strcpy(str,PolyrayFileName);
  389.                MouseShow(1);
  390.                SaveToPolyray(str);
  391.                break;
  392.        case _DATA    : MouseShow(0);
  393.                sprintf(str,"Save As < %s >",FileName);
  394.                strcpy(str,KeyInput(str,TEXT_INPUT));
  395.                if (strlen(str) == 0) strcpy(str,FileName);
  396.                MouseShow(1);
  397.                SaveAFile(str);
  398.                break;
  399.        case _RAW     : MouseShow(0);
  400.                sprintf(str,"Save As < %s >",RAWFileName);
  401.                strcpy(str,KeyInput(str,TEXT_INPUT));
  402.                if (strlen(str) == 0) strcpy(str,RAWFileName);
  403.                MouseShow(1);
  404.                RAW = 1;
  405.                if ((RAWfptr = fopen(str,"w+t")) != NULL) {
  406.                   Preview();
  407.                   fclose(RAWfptr);
  408.                   strcpy(RAWFileName,str);
  409.                }
  410.                RAW = 0;
  411.                break;
  412.        case _GRIDDIVU: ChangeParameter(_GRIDDIVU, 1);
  413.                Redraw();break;
  414.        case _GRIDDIVD: ChangeParameter(_GRIDDIVD, 0);
  415.                Redraw();break;
  416.        case _SPLINEU : ChangeParameter(_SPLINEU,  1);
  417.                Preview();break;
  418.        case _SPLINED : ChangeParameter(_SPLINED,  0);
  419.                Preview();break;
  420.        case _DELTAU     : ChangeParameter(_DELTAU,   1);
  421.                Preview();break;
  422.        case _DELTAD  : ChangeParameter(_DELTAD,   0);
  423.                Preview();break;
  424.        case _SEGSU   : ChangeParameter(_SEGSU,    1);
  425.                Preview();break;
  426.        case _SEGSD   : ChangeParameter(_SEGSD,    0);
  427.                Preview();break;
  428.        case _EXIT    :
  429.           DrawIconHiLite(icon[_EXIT], 1);
  430.           if(YesNoCMD("          Quit?")) QUIT = 1;
  431.           else Redraw();
  432.           DrawIconHiLite(icon[_EXIT], 0);
  433.           break;
  434.      }
  435.        }
  436.     }
  437.   }while(btn != QUIT);
  438.   closegraph();
  439. }
  440.  
  441. /* /////////////////////////////////////////////////////// */
  442. void SaveToPolyray(char * str) {
  443.  FILE *fptr;
  444.  int i=1;
  445.  char s[40];
  446.  strcpy(PolyrayFileName,str);
  447.  sprintf(s,"Overwrite < %s > ?",str);
  448.  if ((fptr = fopen(str,"r")) != NULL) i = YesNoCMD(s);
  449.  fclose(fptr);
  450.  if (i) {
  451.      if ((fptr = fopen(str,"w+t")) == NULL) {
  452.       printf("\7");
  453.       Redraw();
  454.  
  455.      }
  456.      else {
  457.        if(PBnum) {
  458.         fprintf(fptr,"object {\n");
  459.         fprintf(fptr,"    lathe 2, <0, 1, 0>, %d,\n",PBnum);
  460.         for(i=0;i<PBnum;i++) {
  461.            fprintf(fptr,"     <%g, %g, %g>",PointBuffer[i].x,
  462.                          PointBuffer[i].y,
  463.                          PointBuffer[i].z);
  464.            if(i<PBnum-1)
  465.             fprintf(fptr,",\n");
  466.            else
  467.             fprintf(fptr,"\n     shiny_red\n}");
  468.         }
  469.         fclose(fptr);
  470.        }
  471.      }
  472.  }
  473.  Redraw();
  474.  
  475. }
  476.  
  477. void AllocateInputBox(void)
  478. {
  479.  unsigned size;
  480.  size = imagesize(100,100,400,200);
  481.  if ((BitMap = (void *)malloc(size)) == NULL)
  482.  {
  483.   printf("Not enough memory to allocate buffer!\n");
  484.   exit(1);
  485.  }
  486.  MouseShow(0);
  487.  getimage(100,100,400,200,BitMap);
  488.  MouseShow(1);
  489. }
  490.  
  491.  
  492. void EraseInputBox(void)
  493. {
  494.  MouseShow(0);
  495.  putimage(100,100,BitMap,COPY_PUT);
  496.  free(BitMap);
  497.  MouseShow(1);
  498. }
  499.  
  500.  
  501. char * InputBox(char *s)
  502. {
  503.  static char ans[80];
  504.  MouseShow(0);
  505.  AllocateInputBox();
  506.  setfillstyle(1,LIGHTGRAY);
  507.  bar3d(100,100,400,200,0,0);
  508.  setcolor(15);
  509.  rectangle(100,100,400,200);
  510.  rectangle(105,200-2*textheight("W")-5,395,195);
  511.  setcolor(0);
  512.  outtextxy(105,105,s);
  513.  MouseShow(1);
  514.  strcpy(ans,prompt(107,200-2*textheight("W")-3));
  515.  MouseShow(0);
  516.  EraseInputBox();
  517.  MouseShow(1);
  518.  return(ans);
  519. }
  520.  
  521.  
  522. char* KeyInput(char* str,int text)
  523. {
  524.   static char str1[80];
  525.   int i,error;
  526.  
  527.   do
  528.   {
  529.     error = 0;
  530.     strcpy(str1,InputBox(str));
  531.     if (text==0)
  532.     {
  533.     for (i=0;i<strlen(str1);i++)
  534.       if ((!isdigit(str1[i])) && (str1[i] != '.')
  535.      && (toupper(str1[i]) != 'E') && (str1[i] != '-'))
  536.      error = 1;
  537.     }
  538.     else  {
  539.        for (i=0;i<strlen(str1);i++)
  540.          if (str1[i] == ' ') error = 1;
  541.       }
  542.   }while(error);
  543.   return (str1);
  544. }
  545.  
  546. char* prompt (int x,int y)
  547. {
  548.   char KeyChar,key[2];
  549.   static char word[80];
  550.   int j, erase, stop,TW = textwidth("W"),TH = textheight("W")+1;
  551.   j = 0;
  552.   setcolor(0);
  553.   erase = stop = 0;
  554.   key[1] = '\0';
  555.   do
  556.     {
  557.     KeyChar =  getch();
  558.     key[0] = KeyChar;
  559.     if (KeyChar == 13) stop = 1;
  560.     if ((KeyChar == 8) && (j > 0)) erase = 1;
  561.     if (KeyChar == 0) {
  562.       KeyChar = getch();
  563.       if (((KeyChar == 75) || (KeyChar == 83)) && (j > 0)) erase = 1;
  564.     }
  565.     if (stop) word[j] = '\0';
  566.     else
  567.      if (erase) {
  568.        if (j) {
  569.          j --;
  570.          MouseShow(0);
  571.          bar(x+TW*j,y,x+TW*(j+2),y+TH);
  572.          outtextxy(x+TW*j,y,"_");
  573.          MouseShow(1);
  574.        }
  575.        erase = 0;
  576.      }
  577.      else  {
  578.       if(j<34) {
  579.        MouseShow(0);
  580.        bar(x+TW*j,y,x+TW*(j+2),y+TH);
  581.        outtextxy(x+TW*j,y,key);
  582.        outtextxy(x+TW*(j+1),y,"_");
  583.        MouseShow(1);
  584.        word[j] = key[0];
  585.        j++;
  586.       }
  587.      }
  588.     }while(!stop);
  589.  
  590.   return(word);
  591. }
  592.  
  593.  
  594.  
  595. void SaveAFile(char *str)
  596. {
  597.  FILE *fptr;
  598.  int i=1;
  599.  char s[40];
  600.  sprintf(s,"Overwrite < %s > ?",str);
  601.  if ((fptr = fopen(str,"r")) != NULL) i = YesNoCMD(s);
  602.  fclose(fptr);
  603.  if (i) {
  604.      if ((fptr = fopen(str,"w+t")) == NULL) {
  605.       printf("\7");
  606.       Redraw();
  607.  
  608.      }
  609.      else {
  610.        if(PBnum) {
  611.         for(i=0;i<PBnum;i++)
  612.            fprintf(fptr,"%g %g %g\n",PointBuffer[i].x,
  613.                      PointBuffer[i].y,
  614.                      PointBuffer[i].z);
  615.         fclose(fptr);
  616.        }
  617.      }
  618.  }
  619.  Redraw();
  620. }
  621.  
  622.  
  623. void LoadAFile(char *str)
  624. {
  625.  FILE *fptr;
  626.  float x,y,z,r,s;
  627.  int bnum;
  628.  if (  (fptr = fopen(str,"r")) == NULL) {
  629.          printf("\7");
  630.          Redraw();
  631.  }
  632.  else {
  633.      bnum = -1;
  634.      while (!feof(fptr)) {
  635.      if ((fscanf(fptr,"%f",&x) > 0) &&
  636.          (fscanf(fptr,"%f",&y) > 0) &&
  637.          (fscanf(fptr,"%f",&z) > 0)) {
  638.           bnum++;
  639.           PointBuffer[bnum].x = x;
  640.           PointBuffer[bnum].y = y;
  641.           PointBuffer[bnum].z = z;
  642.      }
  643.      }
  644.      fclose(fptr);
  645.      strcpy(FileName,str);
  646.      PBnum = bnum+1;
  647.  }
  648. }
  649.  
  650. void Preview(void) {
  651.   MouseShow(0);
  652.   SetAxesAngles(20, -15, -5);
  653.   ViewPort3D
  654.   clearviewport();
  655.   drawaxis();
  656.   MouseShow(1);
  657.   DrawSpline();
  658. }
  659.  
  660. void ChangeParameter(int which, int UpDown) {
  661.  
  662.   switch(which) {
  663.     case _GRIDDIVU:
  664.     case _GRIDDIVD:
  665.             if (UpDown && GridRowCol < 100) GridRowCol+=2;
  666.             else if (!UpDown && GridRowCol > 10) GridRowCol-=2;
  667.             break;
  668.     case _SPLINEU :
  669.     case _SPLINED :
  670.             if (UpDown && SplineSmooth < 10) SplineSmooth++;
  671.             else if (!UpDown && SplineSmooth > 1) SplineSmooth--;
  672.             break;
  673.     case _DELTAU  :
  674.     case _DELTAD  :
  675.             if (UpDown && DeltaAngle < 90) DeltaAngle += 15;
  676.             else if (!UpDown && DeltaAngle > 15) DeltaAngle -= 15;
  677.             COSDA = cos(DegToRad(DeltaAngle));
  678.             SINDA = sin(DegToRad(DeltaAngle));
  679.             break;
  680.     case _SEGSU   :
  681.     case _SEGSD   :
  682.             if (UpDown && Segments < 24) Segments++ ;
  683.             else if (!UpDown && Segments > 1) Segments--;
  684.             break;
  685.  }
  686.  DisplayVars();
  687. }
  688.  
  689. void DisplayVars(void) {
  690.  
  691.  char s[80];
  692.  FullScreenViewPort
  693.  MouseShow(0);
  694.  setcolor(LIGHTGRAY);
  695.  setfillstyle(SOLID_FILL,LIGHTGRAY);
  696.  bar3d(getmaxy()+40,245,getmaxy()+70,390,0,0);
  697.  setcolor(BLACK);
  698.  sprintf(s,"%d",GridRowCol);
  699.  outtextxy(getmaxy()+40,250,s);
  700.  sprintf(s,"%d",SplineSmooth);
  701.  outtextxy(getmaxy()+40,250+45,s);
  702.  sprintf(s,"%d",(int)DeltaAngle);
  703.  outtextxy(getmaxy()+40,250+85,s);
  704.  sprintf(s,"%d",Segments);
  705.  outtextxy(getmaxy()+40,250+125,s);
  706.  setcolor(WHITE);
  707.  MouseShow(1);
  708. }
  709.  
  710. int SelectAPoint(int x, int y) {
  711.  float wx, wy, dist1, dist2=3.4e38;
  712.  int i, pnt=-1;
  713.  
  714.  ScreenToWorld2D(x,y,&wx, &wy);
  715.  if(!PBnum) return(-1);
  716.  
  717.  for(i=0;i<PBnum;i++) {
  718.     dist1 = (wx - PointBuffer[i].x)*(wx - PointBuffer[i].x) +
  719.         (wy - PointBuffer[i].y)*(wy - PointBuffer[i].y);
  720.     if(dist1 < dist2) {
  721.       dist2 = dist1;
  722.       pnt = i;
  723.     }
  724.  }
  725.  return(pnt);
  726. }
  727.  
  728.  
  729. void DrawIconHiLite(Icon ic, int OnOff)
  730. {
  731.  int color;
  732.  color = getcolor();
  733.  FullScreenViewPort
  734.  if (OnOff) {
  735.    MouseShow(0);
  736.    setcolor(WHITE);
  737.    rectangle(ic.x+1,ic.y+1,ic.x+ic.width-1,ic.y+ic.height-1);
  738.    setcolor(BLACK);
  739.    line(ic.x,ic.y,ic.x+ic.width,ic.y);
  740.    line(ic.x,ic.y,ic.x,ic.y+ic.height);
  741.    line(ic.x+1,ic.y+1,ic.x+ic.width-1,ic.y+1);
  742.    line(ic.x+1,ic.y+1,ic.x+1,ic.y+ic.height-1);
  743.    MouseShow(1);
  744.  }
  745.  else {
  746.    MouseShow(0);
  747.    setcolor(BLACK);
  748.    rectangle(ic.x+1,ic.y+1,ic.x+ic.width-1,ic.y+ic.height-1);
  749.    setcolor(WHITE);
  750.    line(ic.x,ic.y,ic.x+ic.width,ic.y);
  751.    line(ic.x,ic.y,ic.x,ic.y+ic.height);
  752.    line(ic.x+1,ic.y+1,ic.x+ic.width-1,ic.y+1);
  753.    line(ic.x+1,ic.y+1,ic.x+1,ic.y+ic.height-1);
  754.    MouseShow(1);
  755.    setcolor(color);
  756.  }
  757. }
  758.  
  759. void Redraw(void) {
  760.  int i;
  761.  MouseShow(0);
  762.  ViewPort3D
  763.  clearviewport();
  764.  SetAxesAngles(0, 0, 0);
  765.  if (GridStatus) {
  766.    UpdateGridStatus();
  767.    drawgrid();
  768.  }
  769.  drawaxis();
  770.  if (PBnum > 0)
  771.      drawpoint(PointBuffer[0]);
  772.      for(i=1;i<PBnum;i++) {
  773.        drawpoint(PointBuffer[i]);
  774.        drawline(PointBuffer[i],PointBuffer[i-1]);
  775.      }
  776.  MouseShow(1);
  777. }
  778.  
  779. int YesNoCMD(char *s)
  780. {
  781.  char *str[2] = {" Yes"," No"};
  782.  Icon icon[2];
  783.  int i,xpos,ypos,status,choice = 0;
  784.  
  785.  FullScreenViewPort
  786.  CreateIconRow(180,200,55,15,LIGHTGRAY,60,2,icon,str);
  787.  MouseShow(0);
  788.  setfillstyle(1,LIGHTGRAY);
  789.  bar3d(150,150,400,220,0,0);
  790.  for(i=0;i<2;i++) DrawIcon(icon[i]);
  791.  setcolor(BLACK);
  792.  outtextxy(160,160,s);
  793.  setcolor(WHITE);
  794.  outtextxy(161,161,s);
  795.  MouseShow(1);
  796.  do { MouseXY(&xpos, &ypos); }while(!MouseClick());
  797.  for(i=0;i<2;i++) {
  798.    status = IconCheck(icon[i],xpos,ypos);
  799.    if (status) {
  800.      switch(i) {
  801.     case 0: choice = 1;break;
  802.     case 1: choice = 0;break;
  803.      }
  804.    }
  805.  }
  806.  return(choice);
  807. }
  808.  
  809.  
  810. void InitVariables(void) {
  811.   WXleft   = -1;
  812.   WXright  =  1;
  813.   WYtop    =  1;
  814.   WYbottom = -1;
  815.  
  816.   DXmin = 0.0;
  817.   DYmin = 0.0;
  818.   DYmax = getmaxy();
  819.   DXmax = getmaxy();
  820.  
  821.   SetAxesAngles(0, 0, 0);
  822.  
  823.   DrawStatus = 0;
  824.   GridRowCol = 40;
  825.   GridStatus = 0;
  826.   UpdateGridStatus();
  827.   SnapStatus = 0;
  828.   PBnum = 0;
  829.   SplineSmooth = 5;
  830.   DeltaAngle = 30;
  831.   COSDA = cos(DegToRad(DeltaAngle));
  832.   SINDA = sin(DegToRad(DeltaAngle));
  833.   Segments = 12;
  834.   strcpy(FileName,"");
  835.   strcpy(PolyrayFileName,"");
  836.   strcpy(RAWFileName,"");
  837.   strcpy(DXFFileName,"");
  838.   DXF = 0;
  839.   RAW = 0;
  840. }
  841.  
  842. Icon CreateIcon(int xo,int yo,int width,int height,int color,char * text)
  843. {
  844.  Icon temp;
  845.  temp.x = xo;
  846.  temp.y = yo;
  847.  temp.width = width;
  848.  temp.height = height;
  849.  temp.color = color;
  850.  strcpy(temp.str,text);
  851.  return(temp);
  852. }
  853.  
  854. void CreateIconColumn(int xo,int yo,int width,int height,int color,
  855.               int spc, int num, Icon icon[],char **text)
  856. {
  857.  int i,y;
  858.  y = yo;
  859.  for(i=0;i<num;i++) {
  860.    icon[i] = CreateIcon(xo,y,width,height,color,text[i]);
  861.    y += height + spc;
  862.  }
  863. }
  864.  
  865. void CreateIconRow(int xo,int yo,int width,int height,int color,
  866.            int spc, int num, Icon icon[],char **text)
  867. {
  868.  int i,x;
  869.  x = xo;
  870.  for(i=0;i<num;i++) {
  871.    icon[i] = CreateIcon(x,yo,width,height,color,text[i]);
  872.    x += width + spc;
  873.  }
  874. }
  875.  
  876.  
  877. void DrawIcon(Icon ic)
  878. {
  879.  int color;
  880.  color = getcolor();
  881.  MouseShow(0);
  882.  setcolor(0);
  883.  setfillstyle(1,ic.color);
  884.  bar3d(ic.x,ic.y,ic.x+ic.width,ic.y+ic.height,0,0);
  885.  rectangle(ic.x,ic.y,ic.x+ic.width,ic.y+ic.height);
  886.  rectangle(ic.x+1,ic.y+1,ic.x+ic.width-1,ic.y+ic.height-1);
  887.  outtextxy(ic.x+3,ic.y + 5,ic.str);
  888.  setcolor(15);
  889.  line(ic.x,ic.y,ic.x+ic.width,ic.y);
  890.  line(ic.x,ic.y,ic.x,ic.y+ic.height);
  891.  line(ic.x+1,ic.y+1,ic.x+ic.width-1,ic.y+1);
  892.  line(ic.x+1,ic.y+1,ic.x+1,ic.y+ic.height-1);
  893.  outtextxy(ic.x+2,ic.y + 4,ic.str);
  894.  MouseShow(1);
  895.  setcolor(color);
  896. }
  897.  
  898. int IconCheck(Icon ikon,int xm,int ym)
  899. {
  900.  if ((xm > ikon.x) && (xm < ikon.x + ikon.width) &&
  901.      (ym > ikon.y) && (ym < ikon.y + ikon.height))
  902.   return(1);
  903.  else return(0);
  904. }
  905.  
  906.  
  907.  
  908. void DrawSpline(void) {
  909.  
  910.  float ax, ay, az, bx, by, bz,cx, cy, cz, dx, dy, dz;
  911.  float S1x, S1y, S1z, S2x, S2y, S2z, t, tt, ttt;
  912.  POINT3D T[MAXDATA+3], p1, p2;
  913.  int i,j, k;
  914.  
  915.  if(PBnum) {
  916.   if (DXF) fprintf (DXFfptr,"0\nSECTION\n2\nENTITIES\n");
  917.  
  918.  for (i=1;i<PBnum+1;i++) T[i] = PointBuffer[i-1];
  919.  T[0] = T[1];
  920.  T[PBnum+1] = T[PBnum];
  921.  T[PBnum+2] = T[PBnum];
  922.  
  923.    for(j = 1;j<=PBnum-1;j++) {
  924.       // components of slope at point j
  925.       S1x = T[j + 1].x - T[j - 1].x;
  926.       S1y = T[j + 1].y - T[j - 1].y;
  927.       S1z = T[j + 1].z - T[j - 1].z;
  928.  
  929.       // component of slopes at point j+1
  930.       S2x = T[j + 2].x - T[j].x;
  931.       S2y = T[j + 2].y - T[j].y;
  932.       S2z = T[j + 2].z - T[j].z;
  933.  
  934.       // calc ax, bx, cx, dx based on cubic spline definition
  935.       // most of this is not used since point j is located at t = 0
  936.       // where   0<=t<=1  using  {a}t^3 + {b}t^2 + {c}t + {d}  -> Cubic Spline
  937.       //
  938.       //   | a |    |  2  -2  1  1 |   | x(0)  |   <- initial point
  939.       //   | b |  = | -3   3 -2 -1 |   | x(1)  |   <- ending  point
  940.       //   | c |    |  0   0  1  0 |   | x'(0) |   <- initial slope
  941.       //   | d |    |  1   0  0  0 |   | x'(1) |   <- ending  slope
  942.  
  943.       ax =  2 * T[j].x - 2 * T[j + 1].x + S1x + S2x;
  944.       bx = -3 * T[j].x + 3 * T[j + 1].x - 2 * S1x - S2x;
  945.       cx = S1x;
  946.       dx = T[j].x;
  947.  
  948.       ay =  2 * T[j].y - 2 * T[j + 1].y + S1y + S2y;
  949.       by = -3 * T[j].y + 3 * T[j + 1].y - 2 * S1y - S2y;
  950.       cy = S1y;
  951.       dy = T[j].y;
  952.  
  953.       az =  2 * T[j].z - 2 * T[j + 1].z + S1z + S2z;
  954.       bz = -3 * T[j].z + 3 * T[j + 1].z - 2 * S1z - S2z;
  955.       cz = S1z;
  956.       dz = T[j].z;
  957.       for(k=0;k<SplineSmooth + 1;k++) {
  958.      t = k/(float)SplineSmooth;
  959.      tt = t*t;
  960.      ttt = tt *t;
  961.      p1.x = ax * ttt + bx * tt + cx * t + dx;
  962.      p1.y = ay * ttt + by * tt + cy * t + dy;
  963.      p1.z = az * ttt + bz * tt + cz * t + dz;
  964.      if (k==0) p2 = p1;
  965.      else {
  966.        SweepALine(p1, p2);
  967.        p2 = p1;
  968.      }
  969.       }
  970.    }
  971.   if (DXF) fprintf (DXFfptr,"0\nENDSEC\n0\nEOF\n");
  972.  
  973.  }
  974. }
  975.  
  976. void SweepALine(POINT3D pa, POINT3D pb) {
  977.   POINT3D p1,p2,p3,p4;
  978.   int i, j;
  979.  
  980.   MouseShow(0);
  981.  
  982.   p1 = pa;
  983.   p2 = pb;
  984.   for (j=0;j<Segments;j++) {
  985.  
  986.     p3.x  =  COSDA*p1.x + SINDA*p1.z;
  987.     p3.y  =  p1.y;
  988.     p3.z  = -SINDA*p1.x + COSDA*p1.z;
  989.  
  990.     p4.x  =  COSDA*p2.x + SINDA*p2.z;
  991.     p4.y  =  p2.y;
  992.     p4.z  = -SINDA*p2.x + COSDA*p2.z;
  993.  
  994.     if (DXF) {
  995.     fprintf(DXFfptr,"0\n3DFACE\n10\n%g\n20\n%g\n30\n%g\n",p1.x,p1.y,p1.z);
  996.     fprintf(DXFfptr,           "11\n%g\n21\n%g\n31\n%g\n",p2.x,p2.y,p2.z);
  997.     fprintf(DXFfptr,           "12\n%g\n22\n%g\n32\n%g\n",p4.x,p4.y,p4.z);
  998.     fprintf(DXFfptr,           "13\n%g\n23\n%g\n33\n%g\n",p3.x,p3.y,p3.z);
  999.     }
  1000.     if (RAW) {
  1001.     fprintf(RAWfptr,"%g %g %g %g %g %g %g %g %g\n",p1.x,p1.y,p1.z,
  1002.                                p2.x,p2.y,p2.z,
  1003.                                p3.x,p3.y,p3.z);
  1004.     fprintf(RAWfptr,"%g %g %g %g %g %g %g %g %g\n",p2.x,p2.y,p2.z,
  1005.                                p4.x,p4.y,p4.z,
  1006.                                p3.x,p3.y,p3.z);
  1007.     }
  1008.  
  1009.     drawline(p1,p2);
  1010.     drawline(p3,p4);
  1011.     drawline(p1,p3);
  1012.     drawline(p2,p4);
  1013.  
  1014.     p1 = p3;
  1015.     p2 = p4;
  1016.   }
  1017.   MouseShow(1);
  1018. }
  1019.  
  1020. void SweepData(void) {
  1021.   POINT3D p1,p2,p3,p4;
  1022.   int i, j;
  1023.  
  1024.   MouseShow(0);
  1025.  
  1026.   for(i=0;i<PBnum-1;i++) {
  1027.     p1 = PointBuffer[i];
  1028.     p2 = PointBuffer[i+1];
  1029.     for (j=0;j<Segments;j++) {
  1030.  
  1031.       p3.x  =  COSDA*p1.x + SINDA*p1.z;
  1032.       p3.y  =  p1.y;
  1033.       p3.z  = -SINDA*p1.x + COSDA*p1.z;
  1034.  
  1035.       p4.x  =  COSDA*p2.x + SINDA*p2.z;
  1036.       p4.y  =  p2.y;
  1037.       p4.z  = -SINDA*p2.x + COSDA*p2.z;
  1038.  
  1039.  
  1040.  
  1041.       drawline(p1,p2);
  1042.       drawline(p3,p4);
  1043.       drawline(p1,p3);
  1044.       drawline(p2,p4);
  1045.  
  1046.       p1 = p3;
  1047.       p2 = p4;
  1048.  
  1049.     }
  1050.   }
  1051.   MouseShow(1);
  1052. }
  1053.  
  1054. void InitGraphics(void)
  1055. {
  1056.  int gdriver = DETECT, gmode, errorcode;
  1057.  initgraph(&gdriver, &gmode, "");
  1058.  if (gdriver != VGA) {
  1059.   printf("VGA graphics card required.\n");
  1060.   exit(1);
  1061.  }
  1062.  errorcode = graphresult();
  1063.  if (errorcode != grOk)  /* an error occurred */
  1064.  {
  1065.    printf("Graphics error: %s\n", grapherrormsg(errorcode));
  1066.    printf("Press any key to halt:");
  1067.    getch();
  1068.    exit(1); /* terminate with an error code */
  1069.  }
  1070.  setviewport(0,0,getmaxx(),getmaxy(),1);
  1071. }
  1072.  
  1073. float DegToRad(float deg)
  1074. {
  1075.  return(deg*PI/180.0);
  1076. }
  1077.  
  1078. float RadToDeg(float rad)
  1079. {
  1080.  return(rad*180.0/PI);
  1081. }
  1082.  
  1083. void SetAxesAngles(float rx, float ry, float rz) {
  1084.     RX = DegToRad(rx);
  1085.     RY = DegToRad(ry);
  1086.     RZ = DegToRad(rz);
  1087.     COSRX = cos(RX);
  1088.     SINRX = sin(RX);
  1089.     COSRY = cos(RY);
  1090.     SINRY = sin(RY);
  1091.     COSRZ = cos(RZ);
  1092.     SINRZ = sin(RZ);
  1093. }
  1094.  
  1095. void drawgrid (void)
  1096. {
  1097.    int j;
  1098.    float rmax,cmax;
  1099.    POINT3D p1,p2;
  1100.    rmax = g.rmin+g.rowstep*(g.rows);
  1101.    cmax = g.cmin+g.colstep*(g.cols);
  1102.    setcolor(LIGHTGRAY);
  1103.    for (j=0;j<g.cols+1;j++) {
  1104.      p1.x = g.cmin+j*g.colstep;
  1105.      p1.y = rmax;
  1106.      p1.z = 0.0;
  1107.      p2.x = g.cmin+j*g.colstep;
  1108.      p2.y = g.rmin,
  1109.      p2.z = 0.0;
  1110.      drawline(p1,p2);
  1111.    }
  1112.    for (j=0;j<g.rows+1;j++) {
  1113.      p1.x = g.cmin;
  1114.      p1.y = g.rmin+j*g.rowstep;
  1115.      p1.z = 0.0;
  1116.      p2.x = cmax;
  1117.      p2.y = g.rmin+j*g.rowstep;
  1118.      p2.z = 0.0;
  1119.      drawline(p1,p2);
  1120.    }
  1121.    setcolor(WHITE);
  1122. }
  1123.  
  1124. void drawaxis(void)
  1125. {
  1126.   /* draw 3D axis */
  1127.     POINT3D orig,px,py,pz;
  1128.     POINTint p;
  1129.     orig.x = orig.y = orig.z = 0.0;
  1130.     px.x = 0.7*WXright;
  1131.     px.y = px.z = 0.0;
  1132.     py.x = py.z = 0.0;
  1133.     py.y = 0.7*WXright;
  1134.     pz.x = pz.y = 0.0;
  1135.     pz.z = 0.7*WXright;
  1136.     setlinestyle(SOLID_LINE,1,3);
  1137.     setcolor(4);
  1138.     drawline(orig,px);
  1139.     setcolor(2);
  1140.     drawline(orig,py);
  1141.     setcolor(1);
  1142.     drawline(orig,pz);
  1143.     setlinestyle(SOLID_LINE,1,1);
  1144.     setcolor(15);
  1145. }
  1146.  
  1147. POINT3D World3DToWorld2D(POINT3D p)
  1148. {
  1149.   POINT3D ptemp;
  1150.   ptemp = p;
  1151.   if (RX) {
  1152.     ptemp.x  = p.x;
  1153.     ptemp.y  = COSRX*p.y - SINRX*p.z;
  1154.     ptemp.z  = SINRX*p.y + COSRX*p.z;
  1155.     p = ptemp;
  1156.   }
  1157.   if (RY) {
  1158.     ptemp.x  = COSRY*p.x + SINRY*p.z;
  1159.     ptemp.y  = p.y;
  1160.     ptemp.z  = -SINRY*p.x + COSRY*p.z;
  1161.     p = ptemp;
  1162.   }
  1163.   if (RZ) {
  1164.     ptemp.x  = COSRZ*p.x - SINRZ*p.y;
  1165.     ptemp.y  = SINRZ*p.x + COSRZ*p.y;
  1166.     ptemp.z  = p.z;
  1167.   }
  1168.   if (fabs(ptemp.x) < TOL)  ptemp.x = 0.0;
  1169.   if (fabs(ptemp.y) < TOL)  ptemp.y = 0.0;
  1170.   if (fabs(ptemp.z) < TOL)  ptemp.z = 0.0;
  1171.   return(ptemp);
  1172. }
  1173.  
  1174. POINTint World2DToDevice(POINT3D p)
  1175. {
  1176.  
  1177.  POINTint ptemp;
  1178.  ptemp.x = (WXleft-p.x)*(DXmax-DXmin)/(WXleft-WXright) + DXmin + 0.5;
  1179.  ptemp.y = (WYtop-p.y)*(DYmax-DYmin)/(WYtop-WYbottom) + DYmin + 0.5;
  1180.  return(ptemp);
  1181.  
  1182. }
  1183.  
  1184. void drawpoint(POINT3D p1)
  1185. {
  1186.  /* draws a 3D point   */
  1187.  POINTint p2;
  1188.  p1.z = -p1.z;
  1189.  p2 = World2DToDevice(World3DToWorld2D(p1));
  1190.  //circle(p2.x,p2.y,2);
  1191.  rectangle(p2.x - 2, p2.y - 2, p2.x + 2, p2.y + 2);
  1192. }
  1193.  
  1194. void drawline(POINT3D p1,POINT3D p2)
  1195. {
  1196.  /* draws a 3D line  */
  1197.   POINTint p11,p22;
  1198.   p1.z = -p1.z;
  1199.   p2.z = -p2.z;
  1200.   p11  = World2DToDevice(World3DToWorld2D(p1));
  1201.   p22  = World2DToDevice(World3DToWorld2D(p2));
  1202.   line(p11.x,p11.y,p22.x,p22.y);
  1203. }
  1204.  
  1205. void ScreenToWorld2D(int x,int y,float *px, float *py)
  1206. {
  1207.  *px = (DXmin - x)*(WXleft - WXright) / (DXmax - DXmin) + WXleft;
  1208.  *py = (DYmin - y)*(WYtop - WYbottom) / (DYmax - DYmin) + WYtop ;
  1209. }
  1210.  
  1211. void GetGridPoint2D(int mx,int my, float * wx, float * wy)
  1212. {
  1213.  int nx,ny;
  1214.  ScreenToWorld2D(mx,my,wx,wy);
  1215.  nx = (*wx - g.cmin) / (float)g.colstep + .5;
  1216.  ny = (*wy - g.rmin) / (float)g.rowstep + .5;
  1217.  *wx = g.cmin + nx * g.colstep;
  1218.  *wy = g.rmin + ny * g.rowstep;
  1219. }
  1220.  
  1221. void UpdateMousePos(int xpos,int ypos,int status, int draw)
  1222. {
  1223.  int i,j;
  1224.  float wx,wy;
  1225.  char  s[80];
  1226.  UpdateGridStatus();
  1227.  if(SnapStatus == 0)
  1228.   ScreenToWorld2D(xpos,ypos,&wx,&wy);
  1229.  else
  1230.   GetGridPoint2D(xpos,ypos,&wx,&wy);
  1231.  if (fabs(wx) < TOL) wx = 0.0;
  1232.  if (fabs(wy) < TOL) wy = 0.0;
  1233.  setcolor(15);
  1234.  setfillstyle(1,WHITE);
  1235.  bar3d(getmaxy()+15, 3,getmaxx(),18,0,0);
  1236.  bar3d(getmaxy()+15,25,getmaxx(),40,0,0);
  1237.  setcolor(0);
  1238.  sprintf(s,"%g",wx);
  1239.  outtextxy(getmaxy()+17,5,s);
  1240.  sprintf(s,"%g",wy);
  1241.  outtextxy(getmaxy()+17,28,s);
  1242.  if (status && (PBnum < MAXDATA)) {
  1243.    PointBuffer[PBnum].x = wx;
  1244.    PointBuffer[PBnum].y = wy;
  1245.    PointBuffer[PBnum].z = 0.0;
  1246.    setcolor(15);
  1247.    MouseShow(0);
  1248.    ViewPort3D
  1249.    drawpoint(PointBuffer[PBnum]);
  1250.    if (PBnum > 0 && draw) drawline(PointBuffer[PBnum],PointBuffer[PBnum-1]);
  1251.    MouseShow(1);
  1252.    FullScreenViewPort
  1253.    PBnum++;
  1254.  }
  1255. }
  1256.  
  1257. void UpdateGridStatus(void)
  1258. {
  1259.   g.rmin = WXleft;
  1260.   g.cmin = WYbottom;
  1261.   g.rowstep = (fabs(WYbottom)+ fabs(WYtop)) / (float)GridRowCol;
  1262.   g.colstep = (fabs(WXleft)+ fabs(WXright)) / (float)GridRowCol;
  1263.   g.rows = GridRowCol;
  1264.   g.cols = GridRowCol;
  1265. }
  1266.  
  1267.  
  1268. int IsMouse(void)
  1269. {
  1270.    inregs.x.ax = 0;
  1271.    int86(0x33,&inregs,&outregs);
  1272.    return(outregs.x.ax ? outregs.x.bx : 0);
  1273. }
  1274.  
  1275. int MouseClick(void)
  1276. {
  1277.    int click = 0;
  1278.    inregs.x.ax = 5;
  1279.    inregs.x.bx = 1;
  1280.    int86(0x33,&inregs,&outregs);
  1281.    click = outregs.x.bx << 1;
  1282.    inregs.x.bx--;
  1283.    int86(0x33,&inregs,&outregs);
  1284.    return(click | outregs.x.bx);
  1285. }
  1286.  
  1287. void MouseXY(int *xpos,int *ypos)
  1288. {
  1289.    inregs.x.ax = 3;
  1290.    int86(0x33,&inregs,&outregs);
  1291.    *xpos = outregs.x.cx;
  1292.    *ypos = outregs.x.dx;
  1293. }
  1294.  
  1295.  
  1296. void MouseShow(int YesNo)
  1297. {
  1298.    if (YesNo) inregs.x.ax = 1;
  1299.    else inregs.x.ax = 2;
  1300.    int86(0x33,&inregs,&outregs);
  1301. }
  1302.